package hashtable;

import linkedlist.LinkedList;

/**
 * hash表
 * 使用数组和链表组成。
 * key为链表所在的数组的位置，和链表的编号
 * value则是链表的值
 */

class HashTable_Test{
    public static void main(String[] args) {
        HashTable hashTable = new HashTable();
        hashTable.add(0,111);
        hashTable.add(1,222);
        hashTable.add(2,333);
        hashTable.list();
    }
}


public class HashTable {
    // key
    private int key;
    // value
    private Object value;
    // 数组长度
    private int DEFAULT_SIZE_FACTOR = 4<<2;
    // 数组链表 此处的链表使用的是 linkedlist 目录下的 LinkedList 的demo
    private LinkedList[] lists;

    public HashTable() {
        lists = new LinkedList[DEFAULT_SIZE_FACTOR];
    }

    public HashTable(int size) {
        this.DEFAULT_SIZE_FACTOR = size;
        lists = new LinkedList[DEFAULT_SIZE_FACTOR];
    }

    // 获取 此数据在数组上的index
    private  final int hashFun(int key){return key%DEFAULT_SIZE_FACTOR;}

    // 添加数据
    public final void add(int key, Object value){
        // 先获取索引
        int index = hashFun(key);
        // 如果此数组下标没被初始化，则初始化
        if (lists[index] == null) lists[index] =  new LinkedList();
        // 调用链表方法进行存储
        lists[index].add(key, value);
    }

    // 获取数据
    public final void list(){
        for (LinkedList item : lists){
            if (item!=null) item.list();
        }
    }

}
